<article>
    <h1><?php echo $GLOBALS['title'] ?></h1>
    <p>如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库，那么就有可能发生SQL注入安全的问题。</p>
    <p>所谓SQL注入，就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串，最终达到欺骗服务器执行恶意的SQL命令。</p>
    <p>我们永远不要信任用户的输入，我们必须认定用户输入的数据都是不安全的，我们都需要对用户输入的数据进行过滤处理。</p>
    <p>很多时候我们采用动态拼装sql，而这样的方式很容易通过拼接sql字符串进行注入。</p>
    <h3>例如</h3>
    <pre><code>$sql = "select * from user where uid=$uid";</code></pre>
    <p>以上SQL如果有字符串处理，是根本不会这么写的，但有些时间没有字符串时你可能也习惯这么写，如果真这么写那么问题就来了</p>
   	<p>假如访问提交的是<code>http://localhost/index.php?uid=1 or 1=1</code></p>
   	<h4>SQL会变成：</h4>
   	<per><code>select * from user where uid=1 or 1=1</code></per>
   	<p>通过上页我们知道，加引号是多么重要的事情，加上引号看看效果会有什  么变化，SQL变为如下形式</p>
   	<h4>SQL会变成：</h4>
   	<per><code>select * from user where uid='1 or 1=1'</code></per>
   	<p>但是如果你加了引号之后，如果用户再访问提交 http://localhost/index.php?uid=1' or 1=1%23</p>
   	<h4>SQL会变成：</h4>
   	<per><code>select * from user where uid='1' or 1=1#'</code></per>
   	<p>依然可以进行注入，在这种情况下，我们需要怎么做呢，我们尝试着把数据交给mysql_real_escape_string()或者addslashes()来转义特殊的输入字符。</p>
   	<h4>SQL会变成：</h4>
   	<per><code>select * from user where uid='1\' or 1=1#'</code></per>
	<p>注入方式绝大多数依赖 <?php echo htmlspecialchars('<>\'"&') ?> 这几个字符中的一个或几个对内容进行注入攻击。mysql_real_escape_string()并不能处理 <?php echo htmlspecialchars('<>') ?>,那这种情况下我们还应该怎么办，咱们可以通过htmlspecialchars函数将这些字符转换成无害的HTML 实体;目前TP的I方法就默认会对接收的数据通过这个函数进行过滤。</p>
	<p>注入的场景有很多，在这里不一一列举，大家感兴趣，可以通过搜索引擎查找相关资料。</p>
	<p>课外阅读：http://blog.sina.com.cn/s/blog_51af865b01009xsx.html</p>

	<h3>安全注意事项</h3>
	<ol>
		<li>永远不要信任用户的输入。对用户的输入进行校验，可以通过正则表达式，或限制长度；对单引号和 双"-"进行转换等。</li>
		<li>不要把机密信息直接存放，加密或者hash掉密码和敏感的信息。</li>
		<li>应用的异常信息应该给出尽可能少的提示，最好使用自定义的错误信息对原始错误信息进行包装</li>
		<li>使用字符串查询条件，使用预处理机制。</li>
		<li>对数据类型为整形的，可以强制转换成整型。</li>
		<li>提高数据库表和字段的命名技巧，对一些重要的字段根据程序的特点命名，取不易被猜到的。</li>
	</ol>
</article>